Introducción:

Este proyecto en R está enfocado a analizar los datos recogidos por sensores que monitorizan el nivel de ruido en diferentes localizaciones del barrio de Ruzafa.

Instalación de paquetes necesarios:

Especificamos las librerías necesarias en una lista.

##  [1] ".GlobalEnv"           "package:plotrix"      "package:rgdal"       
##  [4] "package:sp"           "package:xts"          "package:zoo"         
##  [7] "package:RColorBrewer" "package:shiny"        "package:leaflet"     
## [10] "package:kableExtra"   "package:GGally"       "package:corrplot"    
## [13] "package:gganimate"    "package:lubridate"    "package:plotly"      
## [16] "package:knitr"        "package:forcats"      "package:stringr"     
## [19] "package:dplyr"        "package:purrr"        "package:readr"       
## [22] "package:tidyr"        "package:tibble"       "package:ggplot2"     
## [25] "package:tidyverse"    "package:stats"        "package:graphics"    
## [28] "package:grDevices"    "package:utils"        "package:datasets"    
## [31] "package:methods"      "Autoloads"            "package:base"

Numeración de los data frames correspondientes a las estaciones de medida:

  1. Datos diarios del sensor de ruido ubicado en el barrio de Ruzafa, en la calle Sueca Esq. Denia
  2. Datos diarios del sensor de ruido ubicado en el barrio de Ruzafa, en la calle Cádiz, 16
  3. Datos diarios del sensor de ruido ubicado en el barrio de Ruzafa, en la calle Cádiz, 3
  4. Datos diarios del sensor de ruido ubicado en el barrio de Ruzafa, en la calle Cuba, 3
  5. Datos diarios del sensor de ruido ubicado en el barrio de Ruzafa, en la calle Sueca, 2
  6. Datos diarios del sensor de ruido ubicado en el barrio de Ruzafa, en la calle Sueca, 61
  7. Datos diarios del sensor de ruido ubicado en el barrio de Ruzafa, en la calle Sueca, 32
  8. Datos diarios del sensor de ruido ubicado en el barrio de Ruzafa, en la calle Carles Cervera, Chaflán Reina Doña María
  9. Datos diarios del sensor de ruido ubicado en el barrio de Ruzafa, en la calle Salvador Abril Chaflán Maestro José Serrano
  10. Datos diarios del sensor de ruido ubicado en el barrio de Ruzafa, en la calle Vivons Chaflán Cádiz
  11. Datos diarios del sensor de ruido ubicado en el barrio de Ruzafa, en la calle Carles Cervera, 34
  12. Datos diarios del sensor de ruido ubicado en el barrio de Ruzafa, en la calle Puerto Rico, 21
  13. Datos diarios del sensor de ruido ubicado en el barrio de Ruzafa, en la calle Doctor Serrano, 21
  14. Datos diarios del sensor de ruido ubicado en el barrio de Ruzafa, en la calle General Prim Chaflán Donoso Cortés
  • Creamos un vector con los nombres de las estaciones para poder acceder a ellos por si fuese necesario.
nombre_estaciones <- 
  c("Datos diarios del sensor de ruido ubicado en el barrio de Ruzafa, en la calle Sueca Esq. Denia",
  "Datos diarios del sensor de ruido ubicado en el barrio de Ruzafa, en la calle Cádiz, 16",
  "Datos diarios del sensor de ruido ubicado en el barrio de Ruzafa, en la calle Cádiz, 3",
  " Datos diarios del sensor de ruido ubicado en el barrio de Ruzafa, en la calle Cuba, 3",
  "Datos diarios del sensor de ruido ubicado en el barrio de Ruzafa, en la calle Sueca, 2",
  " Datos diarios del sensor de ruido ubicado en el barrio de Ruzafa, en la calle Sueca, 61",
  " Datos diarios del sensor de ruido ubicado en el barrio de Ruzafa, en la calle Sueca, 32",
  " Datos diarios del sensor de ruido ubicado en el barrio de Ruzafa, en la calle Carles Cervera, Chaflán Reina Doña María",
  " Datos diarios del sensor de ruido ubicado en el barrio de Ruzafa, en la calle Salvador Abril Chaflán Maestro José Serrano",
  " Datos diarios del sensor de ruido ubicado en el barrio de Ruzafa, en la calle Vivons Chaflán Cádiz",
  " Datos diarios del sensor de ruido ubicado en el barrio de Ruzafa, en la calle Carles Cervera, 34",
  " Datos diarios del sensor de ruido ubicado en el barrio de Ruzafa, en la calle Puerto Rico, 21",
  " Datos diarios del sensor de ruido ubicado en el barrio de Ruzafa, en la calle Doctor Serrano, 21",
  " Datos diarios del sensor de ruido ubicado en el barrio de Ruzafa, en la calle General Prim Chaflán Donoso Cortés")
  • Creamos un vector con los nombres de las estaciones pero más corto y funcional.
nombre_estaciones_corto <- 
  c(" Sueca Esq. Denia",
  " Cádiz, 16",
  " Cádiz, 3",
  " Cuba, 3",
  " Sueca, 2",
  " Sueca, 61",
  " Sueca, 32",
  " Carles Cervera, Chaflán Reina Doña María",
  " Salvador Abril Chaflán Maestro José Serrano",
  " Vivons Chaflán Cádiz",
  " Carles Cervera, 34",
  " Puerto Rico, 21",
  " Doctor Serrano, 21",
  " General Prim Chaflán Donoso Cortés")

Fase 4

Importar los datos

Creamos un vector con los nombres de los ficheros (sin el “.csv”). Con un bucle for y mediante la funcion assign() le asignamos a cada nombre del vector su data frame correspondiente, leido del fichero con la función read_csv. Si se quisiera comprobar el estado de los data frames tras la importación se usaria la funcion head(), que muestra las primeras columnas de un dataframe (dado que ocupa mucho espacio en el html/pdf y no aporta gran informacion al corrector esta parte esta comentada).

nombres <- paste0('df',1:14)

for(x in nombres){
  assign(x,read_csv(str_c("data/",x,".csv"), 
                    col_types = cols(dateObserved = 
                                       col_datetime(format = "%Y-%m-%d"))))
}

vector_dfs <- list(df1,df2,df3,df4,df5,df6,df7,df8,df9,df10,df11,df12,df13,df14)
# for (x in 1:14){print(head(as.data.frame(vector_dfs[[x]]),n=1))}

Fusionar todos los datos en un solo dataframe

Creamos un data frame(“df”) equivalente al df1 con una columna añadida que dice de que estación proviene cada registro (en el primer caso todos provienen de la 1). Con un bucle vamos haciendole joins a df añadiendo toda la informacion del resto de data frames, incluyendo en todos la nueva columna que indica en que estación se han recogido los datos.

df <- df1 %>% mutate(df1,Estacion = 1)

for(x in 2:14){
  df <- full_join(df,mutate(vector_dfs[[x]],Estacion = x))
}

Exploración inicial de los datos

Utilizamos funciones como summary, head… Para asi tener una idea de como están distribuidos nuestros datos y de esta forma trabajar de una manera más sencilla. La función summary nos da una visualización de las columnas, sus clases y otras informaciones. La función glimpse de el paquete dplyr nos da una visualización rapida del dataframe que estamos tratando. Por ultimo la función head nos muestra las primeras filas del df para hacernos una idea real.

summ <- df %>% select(recvTime,LAeq,LAeq_d,LAeq_den,LAeq_e,LAeq_n,dateObserved) %>% 
  summary() %>% as.data.frame() %>% 
  select(-Var1) %>% separate(col = Freq, into = c("h","i"),sep=":") %>% 
  pivot_wider(names_from = h,values_from = i)

kable(summ) %>% kable_styling(bootstrap_options = c("striped","bordered","hover","condensed","responsive"))
Var2 Min. 1st Qu. Median Mean 3rd Qu. Max.
recvTime 2020-09-18 12 2021-01-18 00 2021-06-09 00 2021-07-04 09 2021-12-11 00 2022-04-19 00
LAeq 49.60 58.50 60.40 60.76 62.10 91.30
LAeq_d 51.3 59.6 61.7 Inf 63.3 Inf
LAeq_den 52.60 61.40 63.40 63.99 65.80 96.40
LAeq_e 46.3 57.8 60.1 Inf 63.2 Inf
LAeq_n 40.10 51.40 54.00 54.72 57.50 90.00
dateObserved 2020-09-17 00 2021-01-17 00 2021-06-08 00 2021-07-03 09 2021-12-10 00 2022-04-18 00
#glim <- glimpse(df) # Lo comentamos porque no aporta nada al html

kable(head(df)) %>% kable_styling(bootstrap_options = c("striped","bordered","hover","condensed","responsive"))
_id recvTime fiwareServicePath entityType entityId LAeq LAeq_d LAeq_den LAeq_e LAeq_n dateObserved Estacion
1 2020-11-18 13:40:52 /sonometros NoiseLevelObserved T248652-daily 62.4 64.4 63.7 58.7 51.9 2020-11-17 1
2 2020-11-19 00:00:44 /sonometros NoiseLevelObserved T248652-daily 58.9 60.5 61.3 59.7 51.3 2020-11-18 1
3 2020-11-20 00:00:21 /sonometros NoiseLevelObserved T248652-daily 59.3 60.6 62.5 60.9 53.7 2020-11-19 1
4 2020-11-21 00:00:22 /sonometros NoiseLevelObserved T248652-daily 59.4 60.4 62.7 62.4 53.7 2020-11-20 1
5 2020-11-22 00:02:25 /sonometros NoiseLevelObserved T248652-daily 58.9 60.2 62.0 60.3 53.1 2020-11-21 1
6 2020-11-23 00:00:27 /sonometros NoiseLevelObserved T248652-daily 56.9 58.2 60.8 56.5 53.3 2020-11-22 1

Preguntas que se puedan responder con los datos disponibles

  • Ahora vamos a plantear unas preguntas premiliminares que se puedan responder con los datos disponibles. Si más adelante aparecen nuevas preguntas que puedan parecer interesantes las iremos añadiendo.
  1. ¿En qué franja horaria el nivel sonoro es más alto? ¿Y el más bajo?

La franja horaria con el nivel sonoro más alto es la franja de Dia/Tarde/noche rondando los 65 dB. En cambio la franja horaria con el nivel sonoro más bajo es la de la noche desde las 23 hasta las 7. A pesar de ser la franja con nivel sonoro más bajo es bastante alto si tenemos en cuenta que la legislación europea establece los niveles máximos de ruido hasta los 45 dB durante la noche.

  1. ¿En qué sensor el nivel sonoro registrado es más alto? ¿Y el más bajo?

El sensor que ha llegado a detectar el nivel sonoro más alto fue el ubicado en la estación 8 (calle Carles Cervera, Chaflán Reina Doña María) y por otra parte el sensor que llegó a detectar el nivel sonoro más bajo es el ubicado en la estación 11 (calle Carles Cervera, 34).

  1. ¿En qué sensor el nivel sonoro medio es más alto? ¿Y el más bajo?

En cambio, si no nos fijamos en los máximos y en los mínimos, nos encontramos con que la estación que mayor nivel sonoro medio tiene es la 3 (calle Cádiz 3) y, por el contrario, la estación que tiene menor nivel sonoro medio es la 14 (calle General Prim Chaflán Donoso Cortés). Esto puede ser debido a que haya más bares, discotecas, puntos de encuentro…

  1. ¿En qué día de la semana el nivel sonoro es más alto de media? ¿Y el más bajo?

El día de la semana que tiene un nivel sonoro más alto es el sábado. Es un suceso que lo podríamos llegar a intuir ya que la gente tiene más tiempo libre, hay más desplazamientos, más fiestas… En cambio, el dia que tiene menor nivel sonoro es el lunes. Esto puede ser porque la gente vuelve a la jornada laboral y han tenido suficiente ocio el finde semana.

En cambio, si hablamos de en qué días se han llegado a registrar los niveles sonoros máximos más altos y bajos, los días cambian. Tenemos que el domingo ha tenido el registro de nivel sonoro máximo más alto y el martes es el día con el nivel sonoro máximo más bajo.

Por último, cabe destacar que el día en el que se ha registrado el nivel sonoro mínimo más bajo es también el domingo, y el día con el nivel mínimo más alto es el jueves.

  1. ¿En qué mes el nivel sonoro es más alto? ¿Y el más bajo?

El mes con nivel sonoro más alto de 2021 es septiembre y el más bajo es febrero. En cambio el mes con nivel sonoro más alto cambia en 2022 a marzo. Este dato es muy interesante ya que podemos observar como afectan las Fallas al nivel sonoro. Ya que en 2021 las Fallas se hicieron en septiembre a causa del COVID-19. En cambio, en 2022 se realizaron con total normalidad en marzo. Así se ve reflejado en la gráfica de nivel sonoro por mes.

Durante el resto del año se puede ver más estabilidad en el nivel sonoro, aunque aumenta ligeramente en los meses de verano.

  1. ¿El nivel de ruido depende del día de la semana?

Se puede observar cómo el nivel sonoro aumenta conforme avanza la semana, con niveles más bajos y constantes el lunes y el martes, que aumentan paulatinamente durante el resto de la semana, a excepción del domingo, con una caída notable en el nivel sonoro.

Además, sí que se puede ver una clara tendencia al alza a lo largo de la semana en días con picos de ruido muy elevados, que destacan más los fines de semana, y son mucho menores los lunes y los martes.

  1. ¿El nivel de ruido depende de la estación del año?

Se puede observar que el nivel de sonido en verano es, en general, más alto, puesto que los niveles más bajos del verano son mucho más altos que los niveles más bajos del resto de estaciones, además, en general, se ven más picos de ruido en esta estación.

Por otra parte, en otoño se puede ver que no hay ningún pico de ruido, ya que es el mes con menos festividades.

Invierno y primavera son meses más similares, tienen en general los niveles más bajos, aunque cuentan con algún pico durante las épocas festivas.

  1. ¿Qué franjas horarias tienen los niveles de ruido más parecidos?

La franja horaria del día de 7 a 19 tiene una correlación muy alta con la franja 1min y la franja día-tarde-noche.

Por el contrario, las que tienen una menor correlación, son el día y la noche, como se podría suponer, ya que el día es el momento en el que el nivel sonoro es más elevado, y la noche es el momento en el que es más bajo.

  1. ¿Qué días de la semana tienen los niveles de ruido más parecidos?

Los días de la semana que tienen los niveles de ruido más parecidos son el sábado y domingo como días en los que más nivel sonoro hay. Y es obvio pensar que es porque la gente dispone de más tiempo de ocio. Así por el contrario el lunes y martes también tienen unos niveles bastante parecidos ya que son los inicios de la semana y la gente tiene obligaciones que hacer.

  1. ¿Los niveles de ruido son más altos los fines de semana?

Los días de la semana con picos más altos de sonido son sábado y domingo, y el sábado se mantiene estable como el día con el nivel más alto, pero en general, los domingos baja su intensidad, probablemente porque muchos negocios cierran este día. Por tanto, en general, se puede decir que los niveles de sonido no suben los fines de semana, aunque en momentos puntuales (generalmente festivos), son los días con una mayor intensidad.

  1. ¿Se producen cambios en el nivel de ruido en épocas festivas?

Esta pregunta se puede responder por si sola con la pregunta de niveles máximos por mes, ya que se ha podido comprobar como afecta a la gráfica la época de Fallas.

  1. ¿Se producen cambios en el nivel de ruido en días de mascletà?

En días de mascletà el nivel sonoro aumenta considerablemente, siendo estos los días con mayor intensidad de ruido del año

  1. ¿En qué medida el nivel de ruido depende del sensor que lo mide?

Hay cambios notables en el nivel de ruido en algunas estaciones. Hay una gran diferencia (10 dB) de intensidad entre la estación con el nivel más alto (estación 3, calle Cádiz 3) y el nivel más bajo (estación 14, calle General Prim Chaflán Donoso Cortés).

Sin embargo, las diferencias entre el resto de estaciones es mucho menos notable y tienen un nivel sonoro similar.

Fase 5: Acondicionar los datos para que se correspondan con un tidy dataset

Eliminar datos innecesarios

Por las previsualizaciones que hemos realizado en el apartado anterior podemos darnos cuenta de que hay dos columnas que no varian, por lo tanto, podemos eliminarlas del df. Ya que no aportan ningún valor relevante a este estudio.

all(df$entityType == "NoiseLevelObserved")
all(df$fiwareServicePath == "/sonometros")

df<- df[,-(3:4)]

Renombrar las variables

Otra cosa de gran importancia es que los nombres de las columnas deben ser representativos y se deben poder entender. Por ello les vamos a cambiar los nombres a unos más simples y comprensibles.

colnames(df)
colnames(df)<- c("id","Fecha_dato","id_sensor","1min","Dia 7-19h",
                 "Dia_tarde_noche", "Tarde 19-23h", "Noche 23-7h", 
                 "Dia_medidas", "Estacion")

Representamos las variables en columnas y las observaciones en filas

De esta forma también nos podemos dar cuenta de que hay unas variables puestas como columnas, y para que sea tidy le hemos de dar la vuelta. Ya que cada variable ha de estar representada en una columna. Finalmente visualizamos el data frame “df” tidy

df <-gather(df, key= Franja_horaria, value= Nivel_sonoro ,4:8)

kable(head(df)) %>% kable_styling(bootstrap_options = c("striped","bordered","hover","condensed","responsive"))
id Fecha_dato id_sensor Dia_medidas Estacion Franja_horaria Nivel_sonoro
1 2020-11-18 13:40:52 T248652-daily 2020-11-17 1 1min 62.4
2 2020-11-19 00:00:44 T248652-daily 2020-11-18 1 1min 58.9
3 2020-11-20 00:00:21 T248652-daily 2020-11-19 1 1min 59.3
4 2020-11-21 00:00:22 T248652-daily 2020-11-20 1 1min 59.4
5 2020-11-22 00:02:25 T248652-daily 2020-11-21 1 1min 58.9
6 2020-11-23 00:00:27 T248652-daily 2020-11-22 1 1min 56.9

Ajustes extra de las variables

No puede haber registros con un Nivel sonoro infinito, por lo que seleccionamos la posicion de los registros con Nivel_sonoro = Inf. Dado que hay dos registros con un Nivel Sonoro con valor de Infinito, los reemplazamos por la media del resto de registros. Convertimos la estación a factor. Convertimos la Fecha_dato a fecha. Convertimos la Franja horaria a factor.

min <- min(df$Nivel_sonoro) 
(max <- max(df$Nivel_sonoro)) 
## [1] Inf
pos <- which(df$Nivel_sonoro==Inf)

df$Nivel_sonoro[pos]<-mean(df$Nivel_sonoro[-pos])

df <- df %>% mutate(Estacion = as.factor(Estacion))

df <- df %>% mutate(Fecha_dato = as.Date(Fecha_dato))

df <- df %>% mutate(Franja_horaria = as.factor(Franja_horaria))

#Ordenamos los levels de Franja_horaria

df$Franja_horaria <- factor(df$Franja_horaria, 
                            levels = c("Dia 7-19h","Tarde 19-23h","Noche 23-7h","Dia_tarde_noche","1min"))

Fase 6

Graficos

Análisis univariante

Hacemos un histograma que muestra la densidad de la variable Nivel_sonoro, dibujamos su curva de densidad y una línea roja que marca la media de la variable.

ggplot(df, aes(x = Nivel_sonoro, na.rm = TRUE)) + geom_histogram(aes(y=stat(density)), binwidth = 5, col="blue", fill="red", alpha = .3) + geom_density() + geom_vline(xintercept = mean(df$Nivel_sonoro), linetype="dashed", color = "red")

Si utilizamos table sobre la variable Estacion, podemos ver que todas tienen un número de datos distinto, pero similar, excepto la 5, que tiene muchos menos.

En cambio, si lo utilizamos sobre Franja_horaria, vemos que todas tienen el mismo número de datos.

kable(table(df$Estacion)) %>% 
  kable_styling(bootstrap_options = c("striped","bordered","hover",
                                      "condensed","responsive"),
                full_width=F)
Var1 Freq
1 2385
2 2415
3 2420
4 2275
5 1635
6 2435
7 2310
8 2360
9 2340
10 2420
11 2475
12 2365
13 2480
14 2455
kable(table(df$Franja_horaria)) %>% 
  kable_styling(bootstrap_options = c("striped","bordered","hover",
                                      "condensed","responsive"),
                full_width=F)
Var1 Freq
Dia 7-19h 6554
Tarde 19-23h 6554
Noche 23-7h 6554
Dia_tarde_noche 6554
1min 6554

Análisis bivariante

Utilizando ggcorr de la librería GGally, podemos ver que hay una alta correlación entre las distintas franjas horarias, con algunas acercándose al máximo de correlación.

dfbiv <- df %>% spread(Franja_horaria, Nivel_sonoro)
ggcorr(dfbiv %>% select("Dia 7-19h", "Tarde 19-23h", "Noche 23-7h", "Dia_tarde_noche", "1min"))

También podemos representar esto con ggpairs, que nos muestra el valor exacto de la correlación, además de gráficos para cada para los distintos valores.

ggpairs(dfbiv %>% select("Dia 7-19h", "Tarde 19-23h", "Noche 23-7h", "Dia_tarde_noche", "1min"), progress = FALSE)

Si calculamos la covarianza por Pearson y Spearman, podemos observar que esta es muy alta, lo que quiere decir que la relación entre las variables es elevada

pearson <- cov(dfbiv %>% select("Dia 7-19h", "Tarde 19-23h", "Noche 23-7h", "Dia_tarde_noche", "1min"), 
               method = "pearson")
kable(pearson) %>% kable_styling(bootstrap_options = c("striped","bordered","hover","condensed","responsive"))
Dia 7-19h Tarde 19-23h Noche 23-7h Dia_tarde_noche 1min
Dia 7-19h 15.70265 15.12466 14.05723 15.53460 15.94219
Tarde 19-23h 15.12466 27.25563 23.27546 21.20775 18.02823
Noche 23-7h 14.05723 23.27546 33.02982 25.79746 18.93591
Dia_tarde_noche 15.53460 21.20775 25.79746 23.06050 19.07408
1min 15.94219 18.02823 18.93591 19.07408 17.78236
spearman <- cov(dfbiv %>% select("Dia 7-19h", "Tarde 19-23h", "Noche 23-7h", "Dia_tarde_noche", "1min"), 
                method = "spearman")
kable(spearman) %>% kable_styling(bootstrap_options = c("striped","bordered","hover","condensed","responsive"))
Dia 7-19h Tarde 19-23h Noche 23-7h Dia_tarde_noche 1min
Dia 7-19h 3579689 2331063 1734941 2624739 3385012
Tarde 19-23h 2331063 3579900 2634406 2911871 2726074
Noche 23-7h 1734941 2634406 3579956 3259649 2419767
Dia_tarde_noche 2624739 2911871 3259649 3579819 3193370
1min 3385012 2726074 2419767 3193370 3579685

Nivel sonoro por estación

Seleccionamos la media del nivel sonoro por estación y la estación. Hacemos un grafico de barras con ambas variables, de manera que el color dependa del nivel sonoro medio y añadimos limites al eje x para que se vea mejor la diferencia del nivel sonoro entre estaciones. Finalmente añadimos las etiquetas y leyendas y aplicamos ggplotly para que el gráfico sea interactivo.

g_nsonoro <- df %>% group_by(Estacion) %>% 
  mutate(Media = mean(Nivel_sonoro)) %>% 
  select(Estacion, Media) %>% unique() %>% 
  
  ggplot() + geom_col(aes(x= Estacion, y = Media, fill = Media)) + 
  coord_cartesian(ylim=c(50, 70)) + 
  
  labs(x = "Estaciones", y = "Nivel sonoro medio",
       title ="Nivel sonoro por estación")

  ggplotly(g_nsonoro,tooltip = c("x", "y")) 

Otra forma interesante de ponerlo podría ser mediante boxplots. Primero seleccionamos que dos variables queremos comparar y ponemos que el color dependa de las estaciones. Finalmente añadimos las etiquetas y leyendas.

ggplot(df, aes(Estacion, Nivel_sonoro, colour = Estacion)) +
  geom_boxplot() +
  scale_y_log10() + 
  labs(x = "Estaciones", y = "Nivel sonoro medio",
       title ="Nivel sonoro por estación")

Niveles sonoros máximos y minimos de cada estación

Seleccionamos los máximos y mínimos de cada estación y la estación. Al crear las variables minimo y maximo hay que volver a hacer tidy el data frame. Hacemos un grafico de barras con las variables Estacion, Valor y Medida y agrupando visualmente por estaciones con el argumento position. Finalmente añadimos las etiquetas y leyendas y aplicamos ggplotly para que el gráfico sea interactivo.

g_maxmin <- df %>% group_by(Estacion) %>% 
  mutate(minimo = min(Nivel_sonoro), maximo = max(Nivel_sonoro)) %>% 
  select(Estacion, maximo, minimo) %>%
  unique() %>%
  gather(key = Medida, value =Valor,-Estacion) %>% 
  
  ggplot() + 
  geom_col(aes(x = Estacion,y=Valor, fill=Medida), position = position_dodge(width = 0.65)) + 
  
  labs(x = "Estaciones", y = "Nivel sonoro",
       title ="Niveles sonoros mínimos y máximos por estación")
  
  ggplotly(g_maxmin)

Nivel sonoro por franja horaria

Se selecciona la media del nivel sonoro para cada franja horaria y la propia franja horaria, agrupando por esta última. Se hace un gráfico de barras con ambas variables, de manera que el color dependa del nivel sonoro medio. Se añaden límites en el eje x para que se aprecie mejor la diferencia de nivel sonoro en cada franja horaria.Finalmente añadimos las etiquetas y leyendas y aplicamos ggplotly para que el gráfico sea interactivo.

df %>% group_by(Franja_horaria) %>% 
  mutate(Media = mean(Nivel_sonoro)) %>% 
  select(Franja_horaria, Media) %>% unique() %>% 
  ggplot() + geom_col(aes(x = Franja_horaria, y = Media, fill = Media)) + 
  scale_fill_gradient(name = "nivel", low = "mediumpurple4", high = "mediumorchid") +

  coord_cartesian(ylim=c(50, 65)) +

  labs(x = "Franjas horarias", y = "Nivel sonoro medio",
       title ="Nivel sonoro por franja horaria") +
  transition_states(Franja_horaria, wrap = FALSE) +
  shadow_mark()  +
  enter_fade()

Nivel sonoro por dia de la semana

Primero hacemos una funcion para crear un id numerico del dia de la semana y asi poder hacer un grafico animado. Posteriormente adaptamos el df a nuestras necesidadesy seleccionamos solo las columnas necesarias. Por último, se añaden las etiquetas y el título, convertimos el grafico en animado y escogemos los colores concretos.

id_ds <- function(x){
  match(x,c("lunes","martes","miércoles","jueves","viernes","sábado","domingo"))
}

df %>% 
  mutate(Dia_semana = fct_reorder(weekdays(Dia_medidas), wday(Dia_medidas, week_start = 1))) %>% 
  group_by(Dia_semana,Franja_horaria) %>% 
  mutate(Nivel_por_dia = mean(Nivel_sonoro), id_ds = id_ds(Dia_semana)) %>% 
  
  select(Franja_horaria,Nivel_por_dia, Dia_semana,id_ds) %>% distinct() %>% 
  
  ggplot(aes(x=Dia_semana,y=Nivel_por_dia,col=Franja_horaria,group=Franja_horaria)) + 
  geom_line(size=1) +
  
  
  labs(x = "Días de la semana", y = "Nivel sonoro",
       title ="Nivel sonoro por franja horaria y día de la semana") + 
  

  transition_reveal(id_ds)

Nivel sonoro medio por dia (Con nivel de concentración)

Primero seleccionamos el nivel sonoro por día de la semana y el dia. Después hacemos un grafico de violin con ambas variables, de manera que el color dependa del día. Añadimos una linea horizontal a la altura del Nivel sonoro con el cual empieza a afectar a nuestra concentración para aportar un valor extra al gráfico. Finalmente añadimos las etiquetas y leyendas y aplicamos ggplotly para que el gráfico sea interactivo.

g_dsonoro <- df %>% mutate(Dia_medidas = weekdays(as.Date(Dia_medidas))) %>%  group_by(Dia_medidas) %>% select(Dia_medidas, Nivel_sonoro) %>% unique()

g_dsonoro2 <- ggplot(data = g_dsonoro, aes(x = Dia_medidas,y = Nivel_sonoro)) +
  geom_jitter(size = 1, color = 'gray', alpha = 0.5) +
  geom_violin(aes(fill = Dia_medidas), color = 'black', alpha = 0.8) +
geom_boxplot(color = 'black', alpha = 0.9) +
  
  geom_hline(yintercept=70, linetype="dashed", color = "red") +

  xlab('Días de la semana') + 
  ylab('Nivel sonoro') +
  ggtitle('Nivel sonoro por días de la semana') + 
  theme(legend.position ="none")


ggplotly(g_dsonoro2,tooltip = c("x", "y"))

Nivel sonoro por mes (Con limite segun la OMS)

Primero seleccionamos el nivel sonoro por mes, el mes y el año. Ordenamos los meses. Hacemos un grafico de puntos con ambas variables, de manera que el color dependa del nivel sonoro. Añadimos una linea horizontal a la altura del Nivel sonoro con el cual comienza el riesgo de perdida auditiva crónica y otra a la altura del nivel de ruido recomendado para una vida sana, ambas segun la OMS. Por último, añadimos las etiquetas y leyendas, giramos el angulo de los meses para que se puedan leer correctamente en el eje x y dividimos en años.

meses <-c("enero","febrero","marzo","abril","mayo","junio","julio","agosto",
          "septiembre","octubre","noviembre","diciembre")

df_msonoro <- df  %>% mutate(anyo = year(as.Date(Dia_medidas))) %>% 
  mutate(Dia_medidas = factor(months(as.Date(Dia_medidas))),levels(meses)) %>%  group_by(Dia_medidas) %>%  
  select(Dia_medidas, Nivel_sonoro,anyo)

df_msonoro$Dia_medidas <- factor(df_msonoro$Dia_medidas, levels = meses, ordered = T)
  
g_msonoro <- ggplot(df_msonoro) + #geom_col(aes(x= Dia_medidas, y = Media, fill = Media)) + 
  geom_jitter(aes(x= Dia_medidas, y = Nivel_sonoro, col = Nivel_sonoro)) +
  
  geom_hline(yintercept=85, linetype="dashed", color = "red") +
  geom_hline(yintercept=65, linetype="dashed", color = "blue") +
  

  labs(x = "", y = "Nivel sonoro medio",
       title ="Nivel sonoro por mes") + 
  scale_color_gradient(low="green", high="red") +

  theme(axis.text = element_text(angle = 90))+
  
  facet_grid(.~anyo)

g_msonoro

Como vemos en el grafico solo se superó el umbral del nivel sonoro cuandos e celebraron las fallas (un año no hubo, el siguiente hubo en septiembre y el siguiente en marzo)

Nivel sonoro por estación del año (con valores extra)

Primeramente eliminamos el año del día de medidas y creamos una columna que almacena las estaciones del año para cada medida. Hacemos un gráfico de puntos y un gráfico de violín de manera que el color dependa de la estación del año. Añadimos una línea horizontal marcando el umbral a partir del cual el ruido comienza a ser dañino y otra marcando el umbral a partir del cual el sonido se considera ruido según la OMS. Finalmente añadimos etiquetas y título.

g_estanyo <- df %>% mutate(Dia_medidas = format(Dia_medidas, format="%m-%d")) %>% mutate(Estacion = ifelse(Dia_medidas >= "03-20" & Dia_medidas <= "06-21", "Primavera", ifelse(Dia_medidas >= "06-21" & Dia_medidas <= "09-22", "Verano", ifelse(Dia_medidas >= "09-22" & Dia_medidas <= "12-21", "Otoño", ifelse(Dia_medidas >= "12-21" & Dia_medidas <= "12-31" | Dia_medidas >= "01-01" & Dia_medidas <= "03-20", "Invierno", NA))))) %>% unique() %>% 

ggplot(aes(x = Estacion, y = Nivel_sonoro)) + geom_jitter(aes(color = Estacion), alpha = 0.05) + geom_violin(aes(fill = Estacion), color = "black", alpha = 0.8) + 

  geom_hline(yintercept=75, linetype="dashed", color = "red") +
  geom_hline(yintercept=65, linetype="dashed", color = "darkblue") + 
  
  labs(x = "Estaciones del año", y = "Nivel sonoro",
       title ="Nivel sonoro por estación del año")

g_estanyo

Nivel sonoro mascletà

Primero filtramos para la franja horaria de la mascletà y creamos una nueva columna para determinar qué día hubo mascletà. Creamos los boxplots, de forma que se divida por estaciones y el color dependa de si hubo o no mascletà. Finalmente ponemos las etiquetas y el título y utilizamos ggplotly para que el gráfico sea interactivo, con la función layout agrupando por “boxmode” para que no se superpongan los boxplots.

g_mascleta <- df %>% filter(Franja_horaria == "Dia 7-19h") %>% mutate(hubomascleta = ((Dia_medidas >= as.Date("2021-09-01") & Dia_medidas <= as.Date("2021-09-05")) | Dia_medidas >= as.Date("2022-03-01") & Dia_medidas <= as.Date("2022-03-19"))) %>% 

ggplot(aes(x = Estacion, y = Nivel_sonoro, color = hubomascleta)) + geom_boxplot() +

labs(x = "Estación", y = "Nivel sonoro", title = "Nivel sonoro con y sin mascletà por estación")

ggplotly(g_mascleta,tooltip = c("x", "y", "color")) %>% layout(boxmode = "group")

Nota: no hay datos de días de mascletà en la en la calle Sueca (Estacion 5).

Mapa interactivo de las estaciones

Creamos los subconujuntos de datos que usaremos en las diferentes capas del mapa.

dfmedia <- df %>% 
  group_by(Estacion) %>% 
  mutate(media = mean(Nivel_sonoro)) %>% select(Estacion,media) %>% 
  unique() %>% mutate(media=round(media,2))

dffallas_2021 <-df %>% 
  filter(Dia_medidas >= as.Date("2021-09-01")) %>% 
  filter(Dia_medidas<=as.Date("2021-09-05")) %>% group_by(Estacion) %>% 
  mutate(fallas_2021 = mean(Nivel_sonoro)) %>% select(Estacion,fallas_2021) %>% 
  unique()%>% mutate(fallas_2021=round(fallas_2021,2))

dffallas_2022 <-df %>% 
  filter(Dia_medidas >= as.Date("2022-03-15")) %>% 
  filter(Dia_medidas<=as.Date("2022-03-19")) %>% group_by(Estacion) %>% 
  mutate(fallas_2022 = mean(Nivel_sonoro)) %>% select(Estacion,fallas_2022) %>% 
  unique()%>% mutate(fallas_2022=round(fallas_2022,2))

dfmaxi <-df %>% 
  select(Nivel_sonoro,Estacion) %>% 
  group_by(Estacion) %>% 
  mutate(maxi = max(Nivel_sonoro)) %>% select(Estacion,maxi) %>% 
  unique()%>% mutate(maxi=round(maxi,2))

dfmini <-df %>% 
  select(Nivel_sonoro,Estacion) %>% 
  group_by(Estacion) %>% 
  mutate(mini = min(Nivel_sonoro)) %>% select(Estacion,mini) %>% 
  unique()%>% mutate(mini=round(mini,2))

Creamos un dataframe con latitud, longitud y nombre de las estaciones.

lat <- c(39.462685,
         39.463460,
         39.463938,
         39.46258714943458,
         39.46330306451391,
         39.45984035747688,
         39.461359278727315,
         39.46104687570253,
         39.46347855632092,
         39.46000008564762,
         39.46150290594316,
         39.46122554234543,
         39.46267814413545,39.46252226439023)

lon <- c(-0.375963,
         -0.374725,
         -0.375067, 
         -0.3774455293876197, 
         -0.3765849281924387, 
         -0.37377849367407356, 
         -0.37517753933555137, 
         -0.37274573892832225,
         -0.3706286483806198, 
         -0.3721377888232703, 
         -0.3728233607255255, 
         -0.3757247291124665,
         -0.3739598445556998, 
         -0.3703693446010307)

nom<- c("calle Sueca Esq. Denia",
        "calle Cádiz, 16",
        "calle Cádiz, 3",
        "calle Cuba, 3",
        "calle Sueca, 2",
        "calle Sueca, 61",
        "calle Sueca, 32",
        "calle Carles Cervera, Chaflán Reina Doña María",
        "calle Salvador Abril Chaflán Maestro José Serrano",
        "calle Vivons Chaflán Cádiz",
        "calle Carles Cervera, 34",
        "Calle Puerto Rico, 21",
        "Calle Dr. Serrano, 21",
        "calle General Prim Chaflán Donoso Cortés")

mapita <- data.frame(Nombre = nom,Latitud = lat,Longitud = lon,Estacion = 1:14) %>% mutate(Estacion = as.factor(Estacion))

Unimos dicho dataframe a los subconjuntos previamente calculados.

mapa <- mapita %>% 
  inner_join(y=dfmedia,by=c("Estacion")) %>% 
  inner_join(y=dffallas_2021,by=c("Estacion")) %>% 
  inner_join(y=dffallas_2022,by=c("Estacion")) %>% 
  inner_join(y=dfmaxi,by=c("Estacion")) %>% 
  inner_join(y=dfmini,by=c("Estacion"))

Creamos las funciones de coloreado para los ajustes de los iconos (para que el color varie en funcion del nivel sonoro).

colorear <- function(Nivel_sonoro) {
  if(Nivel_sonoro <= 47){
    "lightgreen"
  } else if(Nivel_sonoro <= 62) {
    "green"
  } else if(Nivel_sonoro <= 77) {
    "orange"
  } else if(Nivel_sonoro <= 92) {
    "red"
  } else{
    "darkred"
  } }

getColorMedia <- function(mapa) {
  sapply(mapa$media, colorear)
}
getColorF21 <- function(mapa) {
  sapply(mapa$fallas_2021, colorear)
}
getColorF22 <- function(mapa) {
  sapply(mapa$fallas_2022, colorear)
}
getColorMax <- function(mapa) {
  sapply(mapa$maxi, colorear)
}
getColorMin <- function(mapa) {
  sapply(mapa$mini, colorear)
}

Creamos las funciones de los ajustes de los iconos para las estaciones del mapa (Usando las funciones de coloreado)

iconsmedia <- awesomeIcons(
  icon = 'ios-close',
  iconColor = 'white',
  library = 'ion',
  markerColor = getColorMedia(mapa)
)

iconsf21 <- awesomeIcons(
  icon = 'ios-close',
  iconColor = 'white',
  library = 'ion',
  markerColor = getColorF21(mapa)
)

iconsf22 <- awesomeIcons(
  icon = 'ios-close',
  iconColor = 'white',
  library = 'ion',
  markerColor = getColorF22(mapa)
)

iconsmax <- awesomeIcons(
  icon = 'ios-close',
  iconColor = 'white',
  library = 'ion',
  markerColor = getColorMax(mapa)
)

iconsmin <- awesomeIcons(
  icon = 'ios-close',
  iconColor = 'white',
  library = 'ion',
  markerColor = getColorMin(mapa)
)

Creamos las funciones del titulo.

tag.map.title <- tags$style(HTML("
  .leaflet-control.map-title { 
    transform: translate(-50%,20%);
    position: fixed !important;
    left: 50%;
    text-align: center;
    padding-left: 10px; 
    padding-right: 10px; 
    background: rgba(255,255,255,0.75);
    font-weight: bold;
    font-size: 18px;
  }
"))

title <- tags$div(
  tag.map.title, HTML("Sensores de ruido de Ruzafa")
)  

Creamos el mapa añadiendo capas de marcadores con la latitud y longitud del dataframe y con los valores de los diferentes subconjuntos. Creamos capas para separar los datos de cada subconjunto y añadimos un titulo (usando las funciones del titulo definidas previamente).

leaflet(data = mapa) %>% addTiles() %>%
  addAwesomeMarkers(~Longitud, ~Latitud, icon=iconsmedia, label=~as.character(mapa$media), group = "Media") %>% 
  addAwesomeMarkers(~Longitud, ~Latitud, icon=iconsf21, label=~as.character(mapa$fallas_2021), group = "Fallas 2021") %>% 
  addAwesomeMarkers(~Longitud, ~Latitud, icon=iconsf22, label=~as.character(mapa$fallas_2022), group = "Fallas 2022") %>% 
  addAwesomeMarkers(~Longitud, ~Latitud, icon=iconsmax, label=~as.character(mapa$maxi), group = "Maximo") %>% 
  addAwesomeMarkers(~Longitud, ~Latitud, icon=iconsmin, label=~as.character(mapa$mini), group = "Minimo") %>% 
  
  #Creamos las capas
  addLayersControl(
    baseGroups = c("Media", "Fallas 2021", "Fallas 2022","Maximo","Minimo"),
    options = layersControlOptions(collapsed = FALSE)
  ) %>%
  
  
  
  #Añadimos el titulo
  addControl(title, position = "topleft", className="map-title") 

Conclusiones Finales y Aportaciones adicionales

Para finalizar el estudio mostraremos las conclusiones a las que hemos podido llegar gracias al analisis de los datos recogidos por los sonómetros ubicados en Ruzafa. Llama la atención la cantidad de información y conclusiones que se pueden llegar a extraer dependiendo de como enfoquemos los datos.

Por ejemplo, desde el punto de vista de emprendimiento, se puede ver cuál es la mejor ubicación para abrir un negocio, ya que podemos relacionar el nivel sonoro con la cantidad de personas que afluentan esa zona. En este caso, convendría abrirlo en la estación 3, Calle Cádiz, 3.

En cambio, si se ve desde el punto de vista del bienestar, no conviene tener un apartamento en esta estación, más bien todo lo contrario, para que no afecte ni a los niveles de concentración ni a los de sueño. Es decir, convendría tener el apartamento en la estación 14, Calle General Prim Chaflán Donoso Cortés.

Otra de las grandes conclusiones que se puede sacar es la dependencia del Barrio Ruzafa de la hostelería y el ocio, ya que los niveles sonoros salen disparados los días de fin de semana, cuando la gente tiene más tiempo libre.

Otra conclusión interesante que se puede extraer, es la contaminación acústica del barrio, puesto que prácticamente todos los días se supera el umbral de sonido recomendado para una vida sana, así como el de la pérdida de concentración y el de ruido en general, según la OMS.